<?php
require_once 'SessionController.php';
if(!verificaLogin())return;
if(!verificaTorneo())return;

require_once '../../../../Utils/Conexion.php';
require_once '../../../Utils/RefreshData.php';

//VARIABLES DE SESSION
$usuarioId = $_SESSION["usuario"]["id"];
$torneo = (isset($_SESSION['torneo']))? $_SESSION['torneo']: 0;

//RECIBIDOS
$accion = (isset($_POST["accion"]))?$_POST["accion"]:FALSE;
$valor = (isset($_POST["valor"]))?$_POST["valor"]:0;


//ACCIONES
if ($accion) {
    if ($accion === 'REBUY') {
        echo setRebuy($valor);
    } else if ($accion === 'ADDON') {
        echo setAddon($valor);
    } else if ($accion === 'MOVER') {
        echo mover($valor);
    } else if ($accion === 'ELIMINAR') {
        echo eliminarParticipante($valor);
    } else if ($accion === 'DESCALIFICAR') {
        echo descalificarParticipante($valor);
    }
}


function getMovimientos($psid) {
    global $torneo;
    $respuesta = false;
    if($psid) {
        $query = "SELECT pm.id, pm.tipo, pm.fecha_hora 
                  FROM poker_movimientos AS pm, poker_specifics AS ps 
                  WHERE pm.persona_id = ps.persona_id 
                  AND ps.id = $psid 
                  AND pm.poker_torneo_id = ".$torneo['id']." 
                  ORDER BY pm.id DESC";
        $movimientos = consultar($query);
        $respuesta = ($movimientos)?$movimientos:FALSE;
    }
    return $respuesta;
}


function getQueryCompras($psid, $tipo){
    global $torneo;
    $query = "SELECT COUNT(m.id) 
                FROM poker_movimientos AS m, poker_asignaciones AS a, poker_specifics AS ps 
                WHERE m.poker_torneo_id = ".$torneo['id']." 
                AND m.poker_asignacion_id = a.id 
                AND m.persona_id = ps.persona_id 
                AND ps.id = $psid 
                AND a.tipo = '$tipo' 
                AND m.oportunidad = ps.oportunidad 
                AND a.id NOT IN ( 
                        SELECT app.poker_asignacion_id 
                        FROM poker_asignaciones_por_persona AS app 
                        WHERE app.persona_id = m.persona_id 
                        AND app.poker_asignacion_id = m.poker_asignacion_id 
                        AND app.estado != 'UTILIZADO' 
                ) ";
    return $query;
}


function getQueryAsignacionesPendientes($psid, $tipo){
    global $torneo;

    $query = "SELECT COUNT(app.id) 
            FROM poker_asignaciones_por_persona AS app, poker_asignaciones AS pa, poker_specifics AS ps 
            WHERE app.poker_asignacion_id = pa.id 
            AND app.persona_id = ps.persona_id 
            AND pa.poker_torneo_id = ".$torneo['id']." 
            AND pa.tipo = '$tipo' 
            AND ps.id = $psid 
            AND app.estado = 'PENDIENTE'";
    return $query;
}



function getData($psid) {
    $data = FALSE;
    
    $query = "SELECT ps.persona_id, p.apenom, ps.estado, ps.oportunidad,  
                     IFNULL(ps.mesa_numero,'-') AS mesa, IFNULL(ps.mesa_posicion,'-') AS posicion, 
                     (".getQueryCompras($psid, "REBUY").") AS rebuys_realizados, 
                     (".getQueryAsignacionesPendientes($psid, "REBUY").") AS rebuys_pendientes,  
                     (".getQueryCompras($psid, "ADD ON").") AS addons_realizados, 
                     (".getQueryAsignacionesPendientes($psid, "ADD ON").") AS addons_pendientes 
              FROM poker_specifics AS ps, personas AS p 
              WHERE p.id = ps.persona_id 
              AND ps.id = $psid LIMIT 1";

    $result = consultar($query);
    if ($result) {
        $data = $result[0];
    }
    return $data;
}







/*
 * ############################################################################
 * ############################################################################
 * ###                                                                      ###
 * ###                          REBUYS Y ADDONS                             ###
 * ###                                                                      ###
 * ############################################################################
 * ############################################################################
 */


//REBUY
function setRebuy($valor) {
    global $torneo, $usuarioId ;
    if(!$valor) {
        die("NO SE RECIBIERON LOS PARAMETROS NECESARIOS.");
    }        
    $datos = explode("~", $valor);
    $psid = trim($datos[0]);
    $tipo = trim($datos[1]);
    
    if($torneo['nivel_actual'] > $torneo['nivel_max_recompras']) {
        die("SE HA SUPERADO EL NIVEL DE COMPRAS.");
    }    
    $data = getData($psid);
    
    if($torneo['limite_recompras']>0) {
        if ($data['rebuys_realizados'] >= $torneo['limite_recompras']) {
            die("EL PARTICIPANTE ALCANZÓ EL LÍMITE DE REBUYS.");
        }
    }
    
    $queryAsignacion ="";
    if($tipo == "NORMAL") {
        $queryAsignacion = "SELECT id, monto, puntos, 0 AS appid 
                            FROM poker_asignaciones 
                            WHERE poker_torneo_id = ".$torneo['id']." 
                            AND tipo = 'REBUY' AND promo = 'NORMAL' LIMIT 1";
    } else if($tipo == "REBUY_PREPAGO") {
        $queryAsignacion = "SELECT pa.id, pa.monto, pa.puntos, app.id AS appid 
                            FROM poker_asignaciones_por_persona AS app, poker_asignaciones pa 
                            WHERE app.poker_asignacion_id = pa.id 
                            AND pa.poker_torneo_id = ".$torneo['id']." 
                            AND app.persona_id = ".$data['persona_id']."  
                            AND pa.tipo = 'REBUY' LIMIT 1";
                
        
    } else if($tipo == "CANJE_ADDON") {
        $queryAsignacion = "SELECT id, monto, puntos, (
                                SELECT app.id 
                                FROM poker_asignaciones_por_persona AS app, poker_asignaciones pa 
                                WHERE app.poker_asignacion_id = pa.id 
                                AND pa.poker_torneo_id = ".$torneo['id']." 
                                AND app.persona_id = ".$data['persona_id']."  
                                AND pa.tipo = 'ADD ON' LIMIT 1
                            ) AS appid 
                            FROM poker_asignaciones 
                            WHERE poker_torneo_id = ".$torneo['id']." 
                            AND tipo = 'REBUY' AND promo = 'NORMAL' LIMIT 1";
    }
    
    $consulta = consultar($queryAsignacion);
    if(!$consulta) {
        die("NO SE PUDO DETERMINAR LA ASIGNACIÓN CORRESPONDIENTE.");
    }
    $asignacion = $consulta[0];
    
    //QUERY MOVIMIENTOS
    $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_asignacion_id, poker_estructura_detalle_id, oportunidad,  tipo, descripcion, comentario, ingreso, egreso) 
              VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".$asignacion['id'].", ".  getQueryEstructura().", ".$data['oportunidad'].", 
                     'REBUY', 'NINGUNA', 'NINGUNA', ".$asignacion['monto'].", 0); ";
    
    if($asignacion['appid']>0) {
        if($tipo == "REBUY_PREPAGO") {
            //REBUY PREPAGO
            $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_estructura_detalle_id, oportunidad, tipo, descripcion, comentario) 
                  VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".  getQueryEstructura().", ".$data['oportunidad'].", 
                          'REBUY PREPAGO', 'SE APLICARON LOS PUNTOS POR EL REBUY PREPAGO', 'LA ASIGNACION PREPAGA CORRESPONDE AL ID: ".$asignacion['appid']."'); ";

            //SETEA COMO UTILIZADO LA ASIGNACION POR PERSONA CORRESPONDIENTE
            $query.= "UPDATE poker_asignaciones_por_persona SET estado = 'UTILIZADO' WHERE id = ".$asignacion['appid']." LIMIT 1; ";
        } else if($tipo == "CANJE_ADDON") {
            //CANJE ADD ON
            $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_asignacion_id, poker_estructura_detalle_id, oportunidad,  tipo, descripcion, comentario) 
                  VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".$asignacion['id'].", ".  getQueryEstructura().", ".$data['oportunidad'].", 
                       'ADD ON X REBUY', 'SE CANJEO UN ADD ON PREPAGO POR UN REBUY', 'LA ASIGNACION PREPAGA CORRESPONDE AL ID: ".$asignacion['appid']."'); ";

            //SETEA COMO CANJEADO LA ASIGNACION POR PERSONA CORRESPONDIENTE
            $query.= "UPDATE poker_asignaciones_por_persona SET estado = 'CANJEADO' WHERE id = ".$asignacion['appid']." LIMIT 1; ";
        }
    }
    
    //AGREGA LOS PUNTOS AL JUGADOR
    $query.= "UPDATE poker_specifics SET puntos = puntos + ".$asignacion['puntos']." WHERE id = $psid LIMIT 1; ";
    
    $e = multiQuery($query);
    
    //EJECUTA EL ACTUALIZADOR DE DATOS DEL TORNEO
    refreshComprasRealizadas($torneo['id']);
    
    
    if($e) {
        echo "OK";
    }else {
        echo "NO SE PUDO GUARDAR EL REBUY, FAVOR REINTENTAR...";
    }
}



//ADDON
function setAddon($valor) {
    global $torneo, $usuarioId ;
    if(!$valor) {
        die("No se recibieron los parametros necesarios.");
    }        
    $datos = explode("~", $valor);
    $psid = trim($datos[0]);
    $tipo = trim($datos[1]);
    
    if($torneo['nivel_actual'] != $torneo['nivel_max_recompras']) {
        die("NO SE PUEDE REALIZAR ADDONS EN EL NIVEL ACTUAL.");
    }    
    $data = getData($psid);
    
    if ($data['addons_realizados'] > 0) {
        die("EL PARTICIPANTE YA REALIZÓ UN ADD ON.");
    }
    
    $queryAsignacion ="";
    if($tipo == "ADDON_PREPAGO") {
        $queryAsignacion = "SELECT pa.id, pa.monto, pa.puntos, app.id AS appid 
                            FROM poker_asignaciones_por_persona AS app, poker_asignaciones pa 
                            WHERE app.poker_asignacion_id = pa.id 
                            AND pa.poker_torneo_id = ".$torneo['id']." 
                            AND app.persona_id = ".$data['persona_id']."  
                            AND pa.tipo = 'ADD ON' LIMIT 1";
        
    } else {
        $queryAsignacion = "SELECT id, monto, puntos, 0 AS appid 
                            FROM poker_asignaciones 
                            WHERE poker_torneo_id = ".$torneo['id']." 
                            AND tipo = 'ADD ON' AND promo = 'NORMAL' LIMIT 1";
    }
    
    $consulta = consultar($queryAsignacion);
    if(!$consulta) {
        die("NO SE PUDO DETERMINAR LA ASIGNACIÓN CORRESPONDIENTE.");
    }
    $asignacion = $consulta[0];
    
    //QUERY MOVIMIENTOS
    $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_asignacion_id, poker_estructura_detalle_id, oportunidad,  tipo, descripcion, comentario, ingreso, egreso) 
              VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".$asignacion['id'].", ".getQueryEstructura().", ".$data['oportunidad'].", 
                'ADD ON', 'NINGUNA', 'NINGUNA', ".$asignacion['monto'].", 0); ";
    
    if($asignacion['appid']>0) {
        if($tipo == "ADDON_PREPAGO") {
            //ADDON PREPAGO
            $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_estructura_detalle_id, oportunidad, tipo, descripcion, comentario) 
                  VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".getQueryEstructura().", ".$data['oportunidad'].", 
                          'ADD ON PREPAGO', 'SE APLICARON LOS PUNTOS POR EL ADD ON PREPAGO', 'LA ASIGNACION PREPAGA CORRESPONDE AL ID: ".$asignacion['appid']."'); ";

            //SETEA COMO UTILIZADO LA ASIGNACION POR PERSONA CORRESPONDIENTE
            $query.= "UPDATE poker_asignaciones_por_persona SET estado = 'UTILIZADO' WHERE id = ".$asignacion['appid']." LIMIT 1; ";
        }
    } 
    
    //AGREGA LOS PUNTOS AL JUGADOR
    $query.= "UPDATE poker_specifics SET puntos = puntos + ".$asignacion['puntos']." WHERE id = $psid LIMIT 1; ";
    
    $e = multiQuery($query);
    
    //EJECUTA EL ACTUALIZADOR DE DATOS DEL TORNEO
    refreshComprasRealizadas($torneo['id']);
    
    
    if($e) {
        echo "OK";
    }else {
        echo "NO SE PUDO GUARDAR EL ADD ON, FAVOR REINTENTAR...";
    }
    
}


/*
 * ############################################################################
 * ############################################################################
 * ###                                                                      ###
 * ###                        MOVER PARTICIPANTE                            ###
 * ###                                                                      ###
 * ############################################################################
 * ############################################################################
 */

//VERIFICA LA DISPONIBILIDAD DE LA MESA Y LUGAR ASIGNADOS
function lugarDisponible($mesa, $posicion) {
    global $torneo;
    $resp = TRUE;
    if($mesa && $posicion) { 
        $query = "SELECT id 
                  FROM poker_specifics 
                  WHERE poker_torneo_id = ".$torneo['id']." 
                  AND mesa_numero = $mesa 
                  AND mesa_posicion = $posicion";
        $r = consultar($query);
        if($r) {
            $resp = FALSE;
        }
    }
    return $resp;
}


//MOVER PARTICIPANTE DE LUGAR
function mover($valor){
    global $torneo, $usuarioId ;
    if(!$valor) {
        die("NO SE RECIBIERON LOS PARAMETROS NECESARIOS.");
    }        
    $datos = explode("~", $valor);
    if(!is_array($datos) && sizeof($datos)!=3){
        die("NO SE RECIBIERON TODOS LOS PARAMETROS.");
    }
    
    $psid = trim($datos[0]);
    $mesa = trim($datos[1]);
    $posicion = trim($datos[2]);
    
    $data = getData($psid);
    
    //VERIFICO QUE NO EXISTA LA POSICION EN MESA
    if(!lugarDisponible($mesa, $posicion)) {
        return "YA EXISTE UN PARTICIPANTE EN LA MESA $mesa CON LA POSICIÓN $posicion.
                <script type='text/javascript'> $('#posicion').val('').focus(); </script>";
    }
    
    
    $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_estructura_detalle_id, oportunidad, tipo, descripcion, comentario) 
              VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".getQueryEstructura().", ".$data['oportunidad'].",  'REUBICACION', 
              'PARTICIPANTE REUBICADO EN MESA $mesa, POSICION $posicion', 'UBICACION DE ORIGEN: MESA ".$data['mesa'].", POSICION ".$data['posicion']."'); ";
    
    $query.= "UPDATE poker_specifics SET mesa_numero = $mesa, mesa_posicion = $posicion WHERE id = $psid LIMIT 1; ";

    
    $e = multiQuery($query);
    echo ($e)?"OK":"NO SE PUDO REGISTRAR EL CAMBIO DE UBICACIÓN, POR FAVOR REINTENTE.";
}


function getQueryEstructura(){
    global $torneo;
    return "(SELECT id FROM poker_estructura_detalles 
             WHERE poker_estructura_id = ".$torneo['poker_estructura_id']." 
             AND nivel = ".$torneo['nivel_actual']." LIMIT 1)";
}



/*
 * ############################################################################
 * ############################################################################
 * ###                                                                      ###
 * ###                      ELIMINAR - DESCALIFICAR                         ###
 * ###                                                                      ###
 * ############################################################################
 * ############################################################################
 */


//ELIMINAR PARTICIPANTE
function eliminarParticipante($psid) {
    global $torneo, $usuarioId;
    
    if(!$psid) {
        die("NO SE RECIBIERON LOS PARAMETROS NECESARIOS");
    }
    $data = getData($psid);
    
    if($data['estado'] == "ELIMINADO" || $data['estado'] == "DESCALIFICADO") {
        die("EL PARTICIPANTE YA SE ENCUENTRA ".$data['estado']);
    }
    
    //DETERMNA EL PUESTO ACTUAL
    $query = "SELECT total_compitiendo AS puesto FROM poker_torneos WHERE id = ".$torneo['id'];
    $resp = consultar($query);
    if($resp){
        $puesto = $resp[0]["puesto"];
        $premios = premiar($puesto, $data);
    } else {
        die("NO SE PUDO DETERMINAR EL PUESTO DEL PARTICIPANTE.");
    }
    
    $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_estructura_detalle_id, oportunidad, tipo, descripcion, comentario) 
              VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".getQueryEstructura().", ".$data['oportunidad'].",  'ELIMINACION', 'PARTICIPANTE ELIMINADO', 'PUESTO: $puesto'); ";
    
    $query.= $premios;
    
    $query.= "UPDATE poker_specifics SET estado = 'ELIMINADO', mesa_numero = NULL, mesa_posicion = NULL, puesto = $puesto WHERE id = $psid LIMIT 1; ";
    
    $query.= "UPDATE poker_asignaciones_por_persona SET estado = 'PERDIDO' WHERE estado = 'PENDIENTE' 
              AND persona_id = ".$data['persona_id']." AND poker_torneo_id = ".$torneo['id'].";";
            
    $e = multiQuery($query);
    if($e) {
        
        if($puesto == 2) {
            setCampeon();
        }
        refreshTorneoData($torneo['id']);
        echo "OK";
    } else {
        echo "NO SE PUDO ELIMINAR AL PARTICIPANTE, POR FAVOR REINTENTE.";
    }
}


//DESCALIFICAR PARTICIPANTE
function descalificarParticipante($psid) {
    global $torneo, $usuarioId;
    
    if(!$psid) {
        die("NO SE RECIBIERON LOS PARAMETROS NECESARIOS");
    }
    $data = getData($psid);
    
    if($data['estado'] == "DESCALIFICADO") {
        die("EL PARTICIPANTE SE YA ENCUENTRA DESCALIFICADO!!");
    }
    
    //DETERMNA EL PUESTO ACTUAL
    $query = "SELECT total_compitiendo AS puesto FROM poker_torneos WHERE id = ".$torneo['id'];
    $resp = consultar($query);
    if($resp){
        $puesto = $resp[0]["puesto"];
        $premios = premiar($puesto, $data);
    } else {
        die("NO SE PUDO DETERMINAR EL PUESTO DEL PARTICIPANTE.");
    }
    
    $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_estructura_detalle_id, oportunidad, tipo, descripcion, comentario) 
              VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".getQueryEstructura().", ".$data['oportunidad'].", 'DESCALIFICACION', 'PARTICIPANTE DESCALIFICADO', 'PUESTO: $puesto'); ";
    
    $query.= $premios;
    
    $query.= "UPDATE poker_specifics SET estado = 'DESCALIFICADO', mesa_numero = NULL, mesa_posicion = NULL, puesto = $puesto WHERE id = $psid LIMIT 1; ";
    
    $query.= "UPDATE poker_asignaciones_por_persona SET estado = 'PERDIDO' WHERE estado = 'PENDIENTE' 
              AND persona_id = ".$data['persona_id']." AND poker_torneo_id = ".$torneo['id'].";";
    
    $e = multiQuery($query);
    
    refreshTorneoData($torneo['id']);
    
    if($e) {
        if($puesto == 2) {
            setCampeon();
        }
        refreshTorneoData($torneo['id']);
        echo "OK";
    } else {
        echo "NO SE PUDO DESCALIFICAR AL PARTICIPANTE, POR FAVOR REINTENTE.";
    }
}




/*
 * ############################################################################
 * ############################################################################
 * ###                                                                      ###
 * ###                               GANADOR                                ###
 * ###                                                                      ###
 * ############################################################################
 * ############################################################################
 */


//ELIMINAR PARTICIPANTE
function setCampeon() {
    global $torneo, $usuarioId;
    
    $query = "SELECT id FROM poker_specifics WHERE estado = 'JUGANDO' AND mesa_numero IS NOT NULL ";
    
    $q = consultar($query);
    if(!$q || sizeof($q)>1) {
        return;
    }
    $psid = $q[0]['id'];
    
    $data = getData($psid);
    
    //DETERMNA EL PUESTO ACTUAL
    $premios = premiar(1, $data);
    
    $query = "INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, poker_estructura_detalle_id, oportunidad, tipo, descripcion, comentario) 
              VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, ".getQueryEstructura().", ".$data['oportunidad'].",  'CAMPEON', 'PARTICIPANTE GANADOR DEL TORNEO', 'PUESTO: 1'); ";
    
    $query.= $premios;
    
    $query.= "UPDATE poker_specifics SET estado = 'GANADOR', mesa_numero = NULL, mesa_posicion = NULL, puesto = 1 WHERE id = $psid LIMIT 1; ";
    
    $query.= "UPDATE poker_asignaciones_por_persona SET estado = 'PERDIDO' WHERE estado = 'PENDIENTE' 
              AND persona_id = ".$data['persona_id']." AND poker_torneo_id = ".$torneo['id'].";";
            
    $mq = multiQuery($query);
    
    if($mq){
        
    }
    
}


//DEVUELVE LA CONSULTA PARA INSERTAR EL PREMIO CORRESPONDIENTE
function premiar($puesto_actual, $data) {
    global $torneo, $usuarioId;
    $respuesta = "";
    if($torneo['nro_premios']>=$puesto_actual) {
        $query = "SELECT id, monto FROM poker_pay_out 
                  WHERE poker_torneo_id = ".$torneo['id']." 
                  AND puesto = $puesto_actual LIMIT 1";
        $q = consultar($query);
        if($q){
            $monto = $q[0]["monto"];
            $respuesta = " INSERT INTO poker_movimientos (poker_torneo_id, persona_id, usuario_id, 
                                poker_payout_id, poker_estructura_detalle_id, oportunidad, 
                                tipo, descripcion, ingreso, egreso) 
                           VALUES (".$torneo['id'].", ".$data['persona_id'].", $usuarioId, 
                                  ".$q[0]["id"].", ".getQueryEstructura().", ".$data['oportunidad'].", 
                                  'PREMIO PUESTO $puesto_actual', 'PUESTO $puesto_actual', 0, ".$q[0]["monto"]."); ";
        }
    }
    return $respuesta;
}